"""
图片生成API端点模块

提供图片生成相关的RESTful API接口，包括：
1. 生成图片
2. 调整图片
3. 获取对话中的图片列表
4. 获取单张图片详情

主要功能：
- 基于提示词生成图片
- 结合历史对话上下文生成和调整图片
- 图片在对话流中的展示
- 支持选中图片进行调整

作者: LLM Chat System
版本: 1.0.0
"""

from typing import List
from fastapi import APIRouter, Depends, HTTPException, status
from sqlalchemy.orm import Session

from app.database import get_db
from app.services.image_generation_service import ImageGenerationService
from app.schemas.image_generation import (
    ImageGenerationRequest,
    ImageGenerationResponse,
    ImageAdjustmentRequest,
    ImageGenerationListResponse
)
from app.api.v1.endpoints.auth import get_current_user
from app.models.user import User
from app.core.logging_config import get_logger

router = APIRouter()
image_service = ImageGenerationService()
logger = get_logger(__name__)


@router.post("/generate", response_model=ImageGenerationResponse)
async def generate_image(
    request: ImageGenerationRequest,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    生成图片接口
    
    根据用户提供的提示词生成图片，并将图片保存在对话流中。
    
    Args:
        request: 图片生成请求，包含提示词、尺寸、质量等参数
        db: 数据库会话，通过依赖注入获取
        current_user: 当前登录用户，通过JWT token验证
        
    Returns:
        ImageGenerationResponse: 包含生成的图片URL、路径等信息
        
    Raises:
        HTTPException: 当对话不存在或处理失败时抛出
    """
    try:
        logger.info(f"收到图片生成请求: 用户ID={current_user.id}, 对话ID={request.conversation_id}, 提示词={request.prompt[:50]}")
        
        user_id = current_user.id
        
        image_gen = await image_service.generate_image(
            db=db,
            user_id=user_id,
            request=request
        )
        
        logger.info(f"图片生成成功: 图片ID={image_gen.id}, URL={image_gen.image_url}")
        return ImageGenerationResponse.model_validate(image_gen)
        
    except ValueError as e:
        logger.error(f"图片生成参数错误: {str(e)}")
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        logger.error(f"图片生成失败: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"图片生成失败: {str(e)}")


@router.post("/adjust", response_model=ImageGenerationResponse)
async def adjust_image(
    request: ImageAdjustmentRequest,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    调整图片接口
    
    基于已生成的图片和用户提供的调整描述，重新生成调整后的图片。
    调整描述会结合原始图片的提示词，生成更符合需求的图片。
    
    Args:
        request: 图片调整请求，包含原始图片ID和调整描述
        db: 数据库会话，通过依赖注入获取
        current_user: 当前登录用户，通过JWT token验证
        
    Returns:
        ImageGenerationResponse: 包含调整后的图片URL、路径等信息
        
    Raises:
        HTTPException: 当原始图片不存在或处理失败时抛出
    """
    try:
        logger.info(f"收到图片调整请求: 用户ID={current_user.id}, 原始图片ID={request.original_image_id}")
        
        user_id = current_user.id
        
        image_gen = await image_service.adjust_image(
            db=db,
            user_id=user_id,
            request=request
        )
        
        logger.info(f"图片调整成功: 新图片ID={image_gen.id}")
        return ImageGenerationResponse.model_validate(image_gen)
        
    except ValueError as e:
        logger.error(f"图片调整参数错误: {str(e)}")
        raise HTTPException(status_code=400, detail=str(e))
    except Exception as e:
        logger.error(f"图片调整失败: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"图片调整失败: {str(e)}")


@router.get("/conversation/{conversation_id}", response_model=ImageGenerationListResponse)
async def get_conversation_images(
    conversation_id: int,
    skip: int = 0,
    limit: int = 50,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    获取对话中的图片列表
    
    获取指定对话中生成的所有图片，按时间倒序排列。
    
    Args:
        conversation_id: 对话ID
        skip: 跳过的记录数，用于分页
        limit: 返回的记录数限制
        db: 数据库会话，通过依赖注入获取
        current_user: 当前登录用户，通过JWT token验证
        
    Returns:
        ImageGenerationListResponse: 包含图片列表和总数
        
    Raises:
        HTTPException: 当对话不存在或无权限访问时抛出
    """
    try:
        user_id = current_user.id
        
        images = image_service.get_conversation_images(
            db=db,
            user_id=user_id,
            conversation_id=conversation_id,
            skip=skip,
            limit=limit
        )
        
        return ImageGenerationListResponse(
            images=[ImageGenerationResponse.model_validate(img) for img in images],
            total=len(images),
            conversation_id=conversation_id
        )
        
    except Exception as e:
        logger.error(f"获取对话图片列表失败: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"获取图片列表失败: {str(e)}")


@router.get("/{image_id}", response_model=ImageGenerationResponse)
async def get_image(
    image_id: int,
    db: Session = Depends(get_db),
    current_user: User = Depends(get_current_user)
):
    """
    获取图片详情
    
    根据图片ID获取图片的详细信息。
    
    Args:
        image_id: 图片ID
        db: 数据库会话，通过依赖注入获取
        current_user: 当前登录用户，通过JWT token验证
        
    Returns:
        ImageGenerationResponse: 图片详细信息
        
    Raises:
        HTTPException: 当图片不存在或无权限访问时抛出
    """
    try:
        user_id = current_user.id
        
        image = image_service.get_image_by_id(
            db=db,
            user_id=user_id,
            image_id=image_id
        )
        
        if not image:
            raise HTTPException(status_code=404, detail="图片不存在")
        
        return ImageGenerationResponse.model_validate(image)
        
    except HTTPException:
        raise
    except Exception as e:
        logger.error(f"获取图片详情失败: {str(e)}", exc_info=True)
        raise HTTPException(status_code=500, detail=f"获取图片详情失败: {str(e)}")

